// 购物车模块
import { getNewCartGoods } from '@/api/cart.js'
import Message from '@/components/library/Message.js'

export default {
  namespaced: true,
  state: {
    list: []
  },
  mutations: {
    // 更新购物车中商品的状态（是否有效）
    updateCart (state, goods) {
      // 根据接口返回的具体数据更新原有的商品的信息（主要为了处理有效性）
      // const currentGoods = state.list[goods.index]
      const currentGoods = state.list.find(item => item.skuId === goods.skuId)
      for (const attr in goods) {
        if (goods[attr] !== null && goods[attr] !== undefined && goods[attr] !== '') {
          // 如果后端返回的商品数据不为空，就更新原有购物车商品的属性
          currentGoods[attr] = goods[attr]
        }
      }
    },

    // 加入购物车
    insertCart (state, goods) {
      // goods: 本地：id skuId name picture price nowPrice count attrsText selected stock isEffective
      // 把goods商品信息添加到list列表中：如果该商品已经存在，就把数据加1即可
      // 如果商品原来不存在直接加进去即可
      const index = state.list.findIndex(item => item.skuId === goods.skuId)
      if (index !== -1) {
        // 原来有这个商品，数量进行累加操作
        state.list[index].count += 1
      } else {
        // 原来不存在该商品，直接加进去
        state.list.unshift(goods)
      }
    }
  },
  actions: {
    // 切换单个商品的状态
    toggleOne (context, goods) {
      const token = context.rootState.user.profile.token
      if (token) {
        // 已经登录
      } else {
        context.commit('updateCart', goods)
      }
    },
    // 删除购物车单个商品
    deleteCart (context, skuId) {
      const token = context.rootState.user.profile.token
      if (token) {
        // 已经登录
      } else {
        // 未登录
        try {
          context.commit('deleteCart', skuId)
          return Promise.resolve('删除商品成功')
        } catch (e) {
          // 用这种方式返回数据，会传递给catch
          return Promise.reject(e.message)
        }
      }
    },

    // 更新购物车中商品的状态（是否有效）
    updateCart (context) {
      // 批量触发接口的调用：根据每一个商品的skuId
      const tasks = []
      context.rootState.cart.list.forEach(item => {
        // 把单次接口调用的任务（Promise实例对象）放入数组
        tasks.push(getNewCartGoods(item.skuId))
      })
      // Promise.all用于并发触发多个异步任务，所有结果返回后执行then
      Promise.all(tasks).then(results => {
        results.forEach((ret, i) => {
          context.commit('updateCart', {
            ...ret.result,
            // index: i
            skuId: context.rootState.cart.list[i].skuId
          })
        })
      }).catch(() => {
        Message({ type: 'error', text: '获取购物车信息失败' })
      })
    },

    // 加入购物车
    insertCart (context, goods) {
      // 判断是否已经登录
      const token = context.rootState.user.profile.token
      if (token) {
        // 已经登录
      } else {
        // 未登录
        context.commit('insertCart', goods)
      }
    }
  },
  getters: {
    // 获取无效的商品列表
    invalidList (state) {
      return state.list.filter(item => !item.isEffective || item.stock === 0)
    },
    // 选中的商品的总价
    selectedTotal (state, getters) {
      return getters.selectedList.reduce((result, item) => result + item.nowPrice * item.count, 0)
    },
    // 选中的商品的数量
    selectedCount (state, getters) {
      return getters.selectedList.reduce((result, item) => result + item.count, 0)
    },
    // 计算选中的商品列表
    selectedList (state) {
      return state.list.filter(item => item.selected)
    },
    // 计算有效的商品列表: isEffective表示位是true且有库存
    validList (state) {
      return state.list.filter(item => item.isEffective && item.stock > 0)
    },
    // 计算有效的商品总数
    validCount (stete, getters) {
      return getters.validList.reduce((result, item) => result + item.count, 0)
    },
    // 计算有效的商品总价
    validTotal (state, getters) {
      return getters.validList.reduce((result, item) => result + item.nowPrice * item.count, 0)
    }
  }
}
